"""
868. 二进制间距
简单
相关标签
premium lock icon
相关企业
给定一个正整数 n，找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1，返回 0 。

如果只有 0 将两个 1 分隔开（可能不存在 0 ），则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如，"1001" 中的两个 1 的距离为 3 。



示例 1：

输入：n = 22
输出：2
解释：22 的二进制是 "10110" 。
在 22 的二进制表示中，有三个 1，组成两对相邻的 1 。
第一对相邻的 1 中，两个 1 之间的距离为 2 。
第二对相邻的 1 中，两个 1 之间的距离为 1 。
答案取两个距离之中最大的，也就是 2 。
示例 2：

输入：n = 8
输出：0
解释：8 的二进制是 "1000" 。
在 8 的二进制表示中没有相邻的两个 1，所以返回 0 。
示例 3：

输入：n = 5
输出：2
解释：5 的二进制是 "101" 。


提示：

1 <= n <= 109
"""


class Solution:
    def binaryGap(self, n: int) -> int:
        bit_count = n.bit_count()
        if bit_count < 2:
            return 0
        ans = 0
        pre = -1 #上个位置
        i = 0 #索引
        while n != 0:
            if n & 1 == 1:
                #当前是1则和上一次1的位置
                if pre != -1: #如果上一个是-1说明当前是第一个1
                    ans = max(ans,i - pre)
                pre = i #当前为上一个
            i += 1
            n = n>>1
        return ans
if __name__ == '__main__':
    print(Solution().binaryGap(22))
    print(Solution().binaryGap(8))
    print(Solution().binaryGap(5))